package com.atguigu.gmall.product.service.impl;

import com.atguigu.gmall.common.consts.RedisConst;
import com.atguigu.gmall.model.product.entity.SkuAttrValue;
import com.atguigu.gmall.model.product.entity.SkuImage;
import com.atguigu.gmall.model.product.entity.SkuSaleAttrValue;
import com.atguigu.gmall.product.service.SkuAttrValueService;
import com.atguigu.gmall.product.service.SkuImageService;
import com.atguigu.gmall.product.service.SkuSaleAttrValueService;
import com.atguigu.gmall.model.product.vo.SaveSkuInfoVo;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.model.product.entity.SkuInfo;
import com.atguigu.gmall.product.service.SkuInfoService;
import com.atguigu.gmall.product.mapper.SkuInfoMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @author lyd
 * @description 针对表【sku_info(库存单元表)】的数据库操作Service实现
 * @createDate 2025-03-10 20:57:08
 */
@Service
public class SkuInfoServiceImpl extends ServiceImpl<SkuInfoMapper, SkuInfo>
        implements SkuInfoService {

    @Autowired
    SkuImageService skuImageService;
    @Autowired
    SkuSaleAttrValueService skuSaleAttrValueService;
    @Autowired
    SkuAttrValueService skuAttrValueService;
    @Autowired
    StringRedisTemplate redisTemplate;

    @Transactional
    @Override
    public void saveSkuInfoDetail(SaveSkuInfoVo vo) {
        //1、保存skuInfo
        SkuInfo skuInfo = new SkuInfo();
        BeanUtils.copyProperties(vo, skuInfo);
        this.save(skuInfo);
        Long skuId = skuInfo.getId();
        //2、保存sku_image
        List<SkuImage> skuImages = vo.getSkuImageList().stream().map(
                item -> {
                    SkuImage skuImage = new SkuImage();
                    skuImage.setSkuId(skuId);
                    skuImage.setImgName(item.getImgName());
                    skuImage.setImgUrl(item.getImgUrl());
                    skuImage.setSpuImgId(item.getSpuImgId());
                    skuImage.setIsDefault(item.getIsDefault());
                    return skuImage;
                }
        ).collect(Collectors.toList());
        skuImageService.saveBatch(skuImages);

        //3、保存sku_sale_attr_value（sku的销售属性）
        List<SkuSaleAttrValue> skuSaleAttrValues = vo.getSkuSaleAttrValueList().stream()
                .map(item -> {
                    SkuSaleAttrValue skuSaleAttrValue = new SkuSaleAttrValue();
                    skuSaleAttrValue.setSkuId(skuId);
                    skuSaleAttrValue.setSpuId(vo.getSpuId());
                    skuSaleAttrValue.setSaleAttrValueId(item.getSaleAttrValueId());
                    return skuSaleAttrValue;
                }).collect(Collectors.toList());
        skuSaleAttrValueService.saveBatch(skuSaleAttrValues);

        //4、保存sku_attr_value（sku的平台属性）
        List<SkuAttrValue> skuAttrValues = vo.getSkuAttrValueList().stream()
                .map(item -> {
                    SkuAttrValue skuAttrValue = new SkuAttrValue();
                    skuAttrValue.setAttrId(item.getAttrId());
                    skuAttrValue.setValueId(item.getValueId());
                    skuAttrValue.setSkuId(skuId);
                    return skuAttrValue;
                }).collect(Collectors.toList());
        skuAttrValueService.saveBatch(skuAttrValues);
    }


    /**
     * 将所有skuId存入到redis的位图中
     */
    @Override
    public void initSkuIdsBitmap() {
        this.lambdaQuery()
                .select(SkuInfo::getId)
                .list()
                .stream()
                .map(SkuInfo::getId)
                .forEach(skuId -> {
                    redisTemplate.opsForValue().setBit(RedisConst.BITMAP_SKUIDS, skuId, true);
                });
    }
}




